package com.browan.freeppmobile.jni;

public class FreePPJNI
{
  public interface StatusListener 
	{
	  static enum eventStatus
		{	EVENT_REGISTRATION,		/* Registration Result, info -> struct RegistrationInfo*/
			EVENT_STATE,				/* Call state Changed, info -> struct CallInfo */
			EVENT_MESSAGE,				/* Message Text, info -> struct MessageInfo */
			EVENT_LOG,					/* Log Text, info -> char* */
			EVENT_CONTROL,				/* conversation control from the peer, info -> struct ControlInfo* */	   
		}
		
		static enum registrationResult {
			REGISTRATION_ACCEPT,
			REGISTRATION_REJECT,
			REGISTRATION_TIMEOUT,
		};
		
		static enum callStatus  {
			CALL_FREE,				/* the call has been hangup by local or remote user*/
			CALL_OUTGOING,          /* the caller has initiated an outgoing call */
			CALL_RINGIN,		    /* an incoming call received and play ring-in sound*/
			CALL_RINGBACK,          /* an outgoing call received by callee and play ringback sound*/
			CALL_ANSWERED,		    /* the call has been answered */
		};
		
		// Call Record Type
		static enum callType {
			OUTGOING_CALL,
			INCOMING_CALL,
			MISSED_CALL,
			REJECTED_CALL,  /* In history, this call should be treated as OUTGOING_CALL */
		};
		
    	/**
		 * 
		 * onEvent(状态监听函数，用于监听底层的状态改变)   
		 * @param type : enum eventStatus
		 * @param jsonString 
		 *  
		 * 		  if(type == EVENT_LOG)
		 * 			jsonString 是一个log message 不需要解析
		 * 	 else if(type == EVENT_REGISTRATION)
		 * 			jsonString格式：{id:%d, reply:%d}
		 * 				reply : enum registrationResult
		 * 	 else if(type == EVENT_STATE) 
		 * 			jsonString格式:{callNo:%d,peer_name:%s, peernum :%s,  activity : %d, state : %d,start : %ld ,  duration :%d ,type :%d }
		 * 						    callNo   :  call ID	
		 * 							peername :  phone number			
		 * 							peernum  :  freePP ID 
		 * 							activity :  enum callStatus
		 * 							state    :  previous state of this call
		 * 							start    :  通话开始时间
		 * 						    duration :  通话时间
		 * 						    type     :  enum callType
		 * 
		 * 	else if (type == EVENT_CONTROL)
		 * 			jsonString格式：{callNo:%d,type:%d,value:%d} 
		 * 							
		 *void  
		 *  
		 *
		 */
		
		public void onEvent(int type, String jsonString );		
	}
	
	/**
	 * 初始化FreePP Mobile Engine
	 *
	 * @param listener  传递给JNI用于监听状态的类。              
	 * @return true succ else failed
	 */
	public native boolean initialize(StatusListener listener); 
	
	/**
	 * 释放FreePP Mobile Engine                 
	 * @return  void
	 */
	public native void  shutdown(); 
	
	/**
	 * 刷新FreePP Mobile Engine的网络连接
	 *
	 * FreePP Mobile Engine在初始化时会创建一个UDP Socket
	 * 并随机绑定一个系统分配的UDP端口。当用户在网络中移动时，
	 * IP地址可能发生变化而导致此Socket失效。这种情况下，
	 * 应用程序只需调用此函数重新分配网络连接即可，
	 * 而无需重启整个FreePP Mobile Engine.
	 * 
	 * 使用情况：该接口在网络失效或网络切换时使用，如
	 * 网络短暂断开后重新连接，需要调用该接口，在
	 * 调用register接口，这样不需要调用init接口
	 * 用户可以重新注册。 
	 * 
	 * @return void
	 */
	public native  void  refreshNetwork(); 
	
    /**
	 * 更改IAX注册时间间隔
	 *
	 * @param secs 刷新时间间隔（秒），默认为 60s
	 *
	 * @return void
	 */
	public  native void  setIaxRegInterval(int secs); 
	

	/**
	 * 设置主叫方Freepp　ID
	 * @param name 用户的昵称，传手机E.164号码即可
	 * @param users 用户的FreePP号码 
	 */
	public native void setcallerid(String name, String users); 
	
	/**
	 * Register to FreePP server 
	 *
	 * @param name    用户的昵称，传手机E.164号码即可
	 * @param user    用户的FreePP号码 
	 * @param passwd  用户的登录密码
	 * @param host    注册服务器的地址和端口，格式为：IP地址:端口(port:4569)  
	 *        
	 * @return 此账号标识符。
	 */
    
	public native int register(String name, String user, String passwd, String host); 
    
    /**
	 * 发起一个外拨呼叫。
	 *
	 * @param dest  被叫端的FreePP号码
	 * @param host  被叫端当前登录的注册服务器，
	 *  			 格式为“IP地址:端口”
	 *  			（注：应用程序在发起呼叫之前应首先通过其它手段，
	 *  			     如：CS服务器的FindCallee，获取被叫当前登录的服务器地址）
	 * @param user  主叫端的身份信息，格式为“用户名/密码”（用户名是什么？）
	 * @param cmd   端到端的呼叫通知（保留），目前传 null 即可
	 *        
	 * @return 此通话的唯一标识符。此标识符将始终处于递增状态，以确保上层应用不会产生混淆。
	 */
	public native int dail (String dest, String host, String user, String cmd); 
    
    /**
	 * 接听一个呼入通话请求。
	 *
	 *  @param callNo   呼入通话的唯一标识符。
	 *  				（注：应用程序首先通过线路状态事件通知获得来电线路的唯一标识符）    
	 * @return void
	 */
	public native void answer (int callNo);
    
    /**
	 * 保持或恢复一个已接听的通话。
	 *
	 * @param callNo   通话的唯一标识符。
	 *  				
	 * @param hold     保持(1)或恢复(0)通话
	 *        
	 * @return void
	 */
	public native void hold(int callNo, int hold) ; 
	
	/**
	 * 静音或取消静音一个已接听的通话。
	 *
	 * @param callNo   此通话的唯一标识符。
	 *  				
	 * @param mute     静音(1)或取消静音(0)。
	 *        
	 * @return void
	 */
	public native void mute (int callNo, int mute); 
    
	/**
	 * 向对端发送DTMF信号。
	 *
	 * @param callNo   此通话的唯一标识符。
	 *  				
	 * @param digit   DTMF信号，包括：0-9,#,*。
	 *        
	 * @return void
	 */
	public native void sendDtmf(int callNo, String digit ); 
	
	/**
	 * 获取指定通话所使用的编解码器信息。
	 *
	 * @param callNo   此通话的唯一标识符。
	 *  				 
	 * @return JSON String
	 * 
	 * JSON格式：{codecName:%s,samplingRate:%d,packetSize:%d,channels:%d,bitrate:%d}
	 */
	public  native String getCodec(int callNo); 
    
	/**
	 * 获取指定通话的网络性能统计。
	 *
	 * @param callNo   此通话的唯一标识符。
	 *  				     
	 * @return JSON String
	 * 
	 *  JSON格式：{level:%d, pklost:%lf, avgspeed:%lf,speed:%lf,delay:%d}
	 *  		  level :general level of network quality (0-6) 
	 *  		 pklost :percentage of lost packet
	 *  	   avgspeed	:average speed from the begining of call
	 *  		  speed :// instant speed for last 1 second
	 *  		  delay :average round trip time
	 */
	public native String getNetStat(int callNo);  
	
	/**
	 * 获取指定通话的详细信息。
	 *
	 * @param callNo   此通话的唯一标识符。
	 *  				        
	 * @return JSON String
	 * 
	 *  JSON格式：{callNo:%d,peer_name:%s, peernum :%s,  activity : %d, state : %d,start : %ld ,  duration :%d ,type :%d }
	 */
	public native String getCallInfo(int callNo ) ; 
	
	/**
	 * 设置指定通话的Codec格式。
	 *
	 * @param callNo   此通话的唯一标识符。
	 *  				
	 * @param format    更新的Codec格式
	 *  
	 *  #define IAXC_FORMAT_ULAW    (1 << 2)   //< Raw mu-law data (G.711) 
   	 *	#define IAXC_FORMAT_ALAW    (1 << 3)   //< Raw A-law data (G.711) 
	 *  #define IAXC_FORMAT_SPEEX   (1 << 9)   //< Speex Audio /
   	 *	#define IAXC_FORMAT_ILBC    (1 << 10)  //< iLBC Audio /
   	 *	#define IAXC_FORMAT_SILK	(1 << 13)  //< SILK Audio /
	 *      
	 * @return 1 succ else 0 call state complete else -1 faild 
	 * 
	 * 		
	 */
	public native int setCodecFormat(int callNo, int format) ; 
   
	/**
	 * 挂断一个通话或拒绝一个呼入请求。
	 *
	 * @param callNo   此通话的唯一标识符。
	 *        
	 * @return void
	 */
	public native void hangup (int callNo); 
	 
	/**
	 * 登出一个FreePP帐号。
	 *
	 * @param regId   登入帐号时返回的标识符
	 *        
	 * @return void
	 */
	public native void unregister(int regId); 

	public native void SetIaxDebug(int debug_switch ); // 0,1 ,default 0
	public native int GetJniVersion ();
	 
}